package la.iok.hzsvn.lewin.movie.operation.mapper;

import la.iok.hzsvn.lewin.movie.operation.entity.FinancialAccount;
import la.iok.hzsvn.lewin.mybatis.mapper.BaseMapper;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;

import java.util.Collection;
import java.util.List;

public interface FinancialAccountMapper extends BaseMapper<FinancialAccount> {
    /**
     * 充值
     * @param id 账号id
     * @param version 记录的当前版本
     * @param amount 充值金额,单位分
     * @return 修改的记录数，应该为1
     */
    int charge(Long id,Long version,Integer amount);

    /**
     * 扣费
     * @param roomId 房间id
     * @param amount 扣费金额
     * @param version 记录的当前版本
     * @return 修改的记录数,应该为1
     */
    int cost(Long roomId, Integer amount, Long version);

    /**
     * 查询一条当月未计算过返利的记录
     * @param month 计算返利的月份。记录的返利月份不等于此值才返回
     * @param excludes 需要排除的账号id集合
     * @return 当月未计算过返利的记录
     */
    FinancialAccount takeOneForReturn(int month, Collection<Long> excludes, @NotNull @NotNullElement Collection<Long> supportReturnMoneyRoomIds);

    /**
     * 预览的时候,拿取所有满足条件的账号
     * @param month 计算返利的月份。记录的返利月份不等于此值才返回
     * @param excludes 需要排除的账号id集合
     * @param supportReturnMoneyRoomIds 支持返利的房间id集合
     * @return 满足条件的账号列表
     */
    List<FinancialAccount> takeForPreview(int month, Collection<Long> excludes, @NotNull @NotNullElement Collection<Long> supportReturnMoneyRoomIds);

    /**
     * 修改记录的月份
     * @param id 记录id
     * @param version 记录当前的版本
     * @param month 新的返利月份
     * @param monthBack 返利月份的备份值
     * @return 修改的记录数,应该为1
     */
    int updateReturnMonth(Long id, Long version, int month, int monthBack);
}
